iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0
自我挑戰組

自學 Java 挑戰:語法、物件導向到專題應用系列 第 7

D07-字串常用方法進階比較與應用

  • 分享至 

  • xImage
  •  

重點:更多常用字串方法 — indexOf, lastIndexOf, contains, replace, replaceAll, startsWith, endsWith,

以下是常用的字串方法 + 用途比較:

方法 功能 / 用途
indexOf(String/char) 在字串中找第一次出現某字串或字元的位置,找不到回傳 -1。可以從某個 fromIndex 開始找。
lastIndexOf(...) 在字串中找最後一次出現某字串或字元的位置。
contains(CharSequence) 判斷某字串是否出現在目標字串中,回傳 boolean
startsWith(String prefix) / endsWith(String suffix) 判斷字串開頭是不是某個 prefix,或結尾是不是某個 suffix。
replace(old, new) / replace(CharSequence target, CharSequence replacement) 以字面(literal)方式替換所有出現的 target → replacement。
replaceAll(regex, replacement) 用正規表達式來匹配,替換所有匹配項目。與 replace 差別在於可以用 regex。
字串比較equals, equalsIgnoreCase** equals 比對內容完全相同,包括大小寫;equalsIgnoreCase 則忽略大小寫差異。

範例:

public class Day7Demo {
    public static void main(String[] args) {
        String s = "Hello, Java World! Hello, Java!";

        // indexOf / lastIndexOf / contains
        int idx1 = s.indexOf("Java");               // 第一次出現 Java
        int idx2 = s.indexOf("Java", idx1 + 1);     // 從第一次之後再找
        int last = s.lastIndexOf("Hello");          // 最後一次 Hello
        boolean hasWorld = s.contains("World");     // 是否包含 "World"
        System.out.println("第一次 Java 在位置: " + idx1);
        System.out.println("第二次 Java 在位置: " + idx2);
        System.out.println("最後一次 Hello 在位置: " + last);
        System.out.println("包含 World 嗎? " + hasWorld);

        // startsWith / endsWith
        System.out.println("以 Hello 開頭嗎? " + s.startsWith("Hello"));
        System.out.println("以 java 結尾嗎? " + s.endsWith("Java!"));   // 注意大小寫

        // replace / replaceAll
        String r1 = s.replace("Java", "Python");
        System.out.println("用 replace → " + r1);

        // 用 replaceAll 和 regex
        String r2 = s.replaceAll("Hello,? ?", "Hi ");  
        // 把 "Hello," 或 "Hello, " 替換成 "Hi "
        System.out.println("用 replaceAll → " + r2);

        // 字串比較
        String a = "Test";
        String b = new String("Test");
        System.out.println("a == b ? " + (a == b));              // 比較參考地址 / 物件
        System.out.println("a.equals(b) ? " + a.equals(b));     // 比較字串內容
        System.out.println("equalsIgnoreCase: " + a.equalsIgnoreCase("test"));
    }
}

輸出(可能結果):

第一次 Java 在位置: 7
第二次 Java 在位置: 25
最後一次 Hello 在位置: 14
包含 World 嗎? true
以 Hello 開頭嗎? true
以 java 結尾嗎? false
用 replace → Hello, Python World! Hello, Python!
用 replaceAll → Hi Python World! Hi Python!
a == b ? false
a.equals(b) ? true
equalsIgnoreCase: true

補充:進階應用

  1. replace vs replaceAll
  • replace:單純替換字串或字元,效率高。
  • replaceAll:支援 正規表達式,功能更強,但效能較差。
    範例:
public class ReplaceDemo {
    public static void main(String[] args) {
        String text = "Hello123World456";

        // replace:直接替換字面
        System.out.println(text.replace("123", "ABC")); 
        // HelloABCWorld456

        // replaceAll:使用 regex
        System.out.println(text.replaceAll("\\d+", "#")); 
        // Hello#World#
    }
}
  1. indexOf 與 contains 效能比較
    其實 contains(x) 內部就是呼叫 indexOf(x) >= 0。
    所以效能幾乎相同,只是 contains 語意更清楚。

3.字串比較的陷阱

  • == 比較的是 記憶體位址(是否為同一物件)。
  • equals 才是比較內容。
public class CompareDemo {
    public static void main(String[] args) {
        String a = "Java";
        String b = "Java";
        String c = new String("Java");

        System.out.println(a == b);       // true (字串池 String Pool 重複利用)
        System.out.println(a == c);       // false (不同物件)
        System.out.println(a.equals(c));  // true (內容相同)
    }
}

  1. 大量字串處理 → 使用 StringBuilder
    如果需要 頻繁拼接或修改字串,不要直接用 +,因為每次操作都會建立新物件。
public class BuilderDemo {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < 5; i++) {
            sb.append("Item").append(i).append(", ");
        }

        System.out.println(sb.toString());
    }
}

輸出結果:

Item0, Item1, Item2, Item3, Item4, 

(💡 StringBuilder 在單執行緒下效能最佳;多執行緒則用 StringBuffer(執行緒安全)。)


上一篇
D06-Java 陣列 + 閱讀 Java API 文件 & 基本字串操作介紹
系列文
自學 Java 挑戰:語法、物件導向到專題應用7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言